<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        // this指向
        //   事件处理函数中    绑定事件的对象
        //   普通函数中       window
        //   严格模式下      普通函数  undefined
        //   对象中          this 指向对象本身

        //   箭头函数    指向上文所指


        //  改变this指向的方法
        //    call(新的指向对象 , 正常的参数1,正常的参数2...)  
        //    apply(新的指向对象 , [正常的参数1,正常的参数2...])
        //    bind(新的指向对象 , 正常的参数1,正常的参数2...)()


        //   call和apply是改变this指向，且执行这个函数

        //   bind 只是改变指向，但不执行




        // var name = 'window';

        // const obj1 = {
        //     name: 'aa',
        //     say: function (m, n) {
        //         console.log(this.name + m + n);
        //     }
        // }

        // const obj2 = {
        //     name: 'cc',
        //     say: function (m, n) {
        //         console.log(this.name + m + n);

        //         // fn.call(obj2);
        //         fn.call(this);

        //         function fn() {
        //             console.log(this.name)
        //         }
        //     }
        // }


        // obj2.say(1, 2)


        // obj2.say这个函数本身的this指向是obj2   把say函数中的this指向了obj1
        // obj2.say.call(obj1, 1, 2)   // aa12



        var name = 'window';

        const obj1 = {
            name: 'aa',
            say: function (m, n) {
                console.log(this.name + m + n);
            }
        }

        const obj2 = {
            name: 'cc',
            say: function (m) {
                console.log(this.name + m);

                // fn.call(this);
                fn.apply(this);
                function fn() {
                    console.log(this.name)
                }
            }
        }


        // obj2.say(1, 2)
        // obj2.say.apply(obj1, [1]);


        // obj2.say(1)



        obj2.say.bind(obj1, 1)()






    </script>

</body>

</html>